package studio7.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import studio7.dao.BaseDAO;
import studio7.exception.DAOException;
import studio7.modelo.Instrumento;
import studio7.modelo.Local;
import studio7.modelo.Reserva;
import studio7.modelo.Sala;
import studio7.modelo.Servicio;
import studio7.modelo.Usuario;
import studio7.util.ConexionBD;



public class ReservaDAO extends BaseDAO{

	public void insertarReserva(Reserva ro) throws DAOException {
		System.out.println("ReservaDAO: insertar(Reserva ro)");
		String query = "INSERT INTO reserva(FechaReserva, HoraInicioReserva, HoraFinReserva, EstadoReserva, costoTotal, Usuario_idUsuario, sala_instrumento_Sala_idSala) VALUES (?,?,?,?,?,?,?)";
		String query2="";
		int idComodin=0;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
						
		try {
			con = ConexionBD.obtenerConexion();
			con.setAutoCommit(false);
			stmt = con.prepareStatement(query);
			stmt.setString(1, ro.getFechaReserva());
			stmt.setString(2, ro.getHoraInicioReserva());
			stmt.setString(3, ro.getHoraFinReserva());
			stmt.setInt(4, ro.getEstadoReserva());
			stmt.setDouble(5, ro.getCostoTotal());
			stmt.setInt(6, ro.getUsuario().getCodUsuario());
			stmt.setInt(7, ro.getSala().getIdSala());
						
			int i = stmt.executeUpdate();
			
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Para los servicios
			int idp = 0;
			query = "SELECT LAST_INSERT_ID()";
			
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				idp = rs.getInt(1);
			}
			//con.commit();
			ro.setCodReserva(idp);
			idComodin = idp;
			
			//Para el servicio
			if(ro.getServicios().size()>0){
				
			for (Servicio ser : ro.getServicios()) {
				query = "INSERT INTO Servicio_Reserva(Reserva_idReserva, Servicio_idServicio)VALUES (?,?) ";
				stmt = con.prepareStatement(query);	
				stmt.setInt(1,idp);
				stmt.setInt(2,ser.getIdServicio());
				int u = stmt.executeUpdate();
				System.out.println("ver esto. " + u);
				if (u != 1) {
					
					throw new SQLException("No se pudo insertar");				
				}
				int idd = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					idd = rs.getInt(1);
				}
				ser.setIdServicio(idd);
				con.commit();
			}
		}	
			//Para los Instrumentos
			
			ro.setCodReserva(idp);
			if(ro.getInstrumentos().size()>0){
			
			for (Instrumento ins : ro.getInstrumentos()) {
				query2 = "INSERT INTO Instrumento_Reserva(Reserva_idReserva, sala_instrumento_idInstrumento) VALUES (?,?)";
				stmt = con.prepareStatement(query2);		
				
				stmt.setInt(1,idComodin);
				stmt.setInt(2,ins.getCodigoInstrumento());	
				int u = stmt.executeUpdate();
				if (u != 1) {
					throw new SQLException("No se pudo insertar");
				}
				int idd = 0;
				query2 = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query2);
				rs = stmt.executeQuery();
				if (rs.next()) {
					idd = rs.getInt(1);
				}
				ins.setCodigoInstrumento(idd);
			}
			con.commit();
		}
			con.commit();
			
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		
	}
	
	public void eliminarReserva(int codReserva) throws DAOException {
		System.out.println("ReservaDAO: eliminar(Reserva)");
		
		//Para la clase Servicio_Reserva
		String query = "DELETE FROM Servicio_Reserva WHERE Reserva_idReserva=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codReserva);
			int i = stmt.executeUpdate();
			if (i < 0) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} 
		//Para la clase Istrumento_Reserva
		query = "DELETE FROM Instrumento_Reserva WHERE Reserva_idReserva=?";
		con = null;
		stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codReserva);
			int i = stmt.executeUpdate();
			if (i < 0) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		}
		//Para la clase Reserva
		query = "DELETE FROM Reserva WHERE idReserva=?";
		con = null;
		stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codReserva);
			int i = stmt.executeUpdate();
			if (i < 0) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		}
		finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	//Busqueda Servicios Adicionales-- Franco
	public Collection<String>busquedaServiciosAdicionales(int idSala) throws DAOException{
		Collection<String>coServicios = new ArrayList<String>();
		ServicioDAO serv = new ServicioDAO();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			LocalesDAO Locales=new LocalesDAO();
			String query = "SELECT Servicios_idServicio from atencion " +
					" where Sala_idSala = ?";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idSala);
			rs = stmt.executeQuery();
			while (rs.next()) {
				int IDservicio=rs.getInt(1);
				String nombreServicio = serv.BuscarServicio(IDservicio);
				coServicios.add(nombreServicio);    
				//System.out.print(IDservicio);
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		
		return coServicios;
	}
	
	//Busqueda instrumentos Adicionales--Franco
	public Collection<String>busquedaInstrumentosAdicionales(int idSala) throws DAOException{
		Collection<String>coInstrumentos = new ArrayList<String>();
		InstrumentoDAO inst = new InstrumentoDAO();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			LocalesDAO Locales=new LocalesDAO();
			String query = "SELECT Instrumento_idInstrumento from sala_instrumento " +
					" where Sala_idSala = ?";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idSala);
			rs = stmt.executeQuery();
			while (rs.next()) {
				int IDservicio=rs.getInt(1);
				String nombreServicio = inst.BuscarInstrumento(IDservicio);
				coInstrumentos.add(nombreServicio);    
				//System.out.print(IDservicio);
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		
		return coInstrumentos;
	}
	//BUSQUEDA DE SERVICIO POR RESERVA(SALA)
	public Collection<Servicio> buscarServicioxSala(int idSala) throws DAOException {
		final String log = "[ ReservaDAO.buscarServicioxSala ] ";
		System.out.println(log + "INICIO");
		String query = "select idServicio, nombre from servicio where idServicio in ";
		query = query + "(SELECT Servicio_idServicio FROM Servicio_Reserva where Reserva_idReserva in ";
		query = query + " (select idReserva from reserva where sala_instrumento_Sala_idSala = " + idSala + ")";
		query = query + " group by Servicio_idServicio)";
		Collection<Servicio> lista = new ArrayList<Servicio>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Servicio se = new Servicio();
				se.setIdServicio(rs.getInt(1));
				se.setNombreServicio(rs.getString(2));
				lista.add(se);
				System.out.println(log + "IdServicio : " + se.getIdServicio() + " | Nombre del Servicio : " + se.getNombreServicio());
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(log + "Se encontraron " + lista.size() + " registros");
		System.out.println(log + "FIN");
		return lista;
	}
	
//BUSQUEDA DE RESERVA POR FECHA y SALA
	
	public Collection<Instrumento> buscarReservaxSala( int Sala_idSala) throws DAOException {
			System.out.println("ReservaDAO: buscarReservaxSala(int Sala_idSala)");
			String query = "select idReserva, fechaReserva from reserva where idReserva in ";
			query = query + "(SELECT Servicio_idServicio FROM _Reserva where Reserva_idReserva in ";
			query = query + " (select idReserva from reserva where sala_instrumento_Sala_idSala = " + Sala_idSala + ")";
			query = query + " group by Servicio_idServicio)";
			//System.out.println("query --> " + query);
			Collection<Instrumento> lista1 = new ArrayList<Instrumento>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				while (rs.next()) {
					Instrumento se = new Instrumento();
					se.setSalaIdSala(rs.getInt(7));
					//se.setNombreSala(rs.getString(2));
					lista1.add(se);
					System.out.println("IdSala : " + se.getSalaIdSala());
					
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOException(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			System.out.println("Se encontraron " + lista1.size() + " registros");
			return lista1;
		}	
	
	public Collection<Reserva> listarReserva() throws DAOException {
		System.out.println("ReservaDAO: listarReserva()");
		Collection<Reserva> r = new ArrayList<Reserva>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT * from reserva";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Reserva vo = new Reserva();
				vo.setCodReserva(rs.getInt(0));
				vo.setFechaReserva(rs.getString("Fecha"));
				vo.setHoraInicioReserva(rs.getString("H Inicio"));
				vo.setHoraFinReserva(rs.getString("H Fin"));
				vo.setEstadoReserva(rs.getInt(4));
				vo.setEstadoReserva(rs.getInt(5));
			    vo.setCostoTotal(rs.getDouble(6));
				    
				Usuario re= new Usuario();
				re.setCodUsuario(rs.getInt(0));
				vo.setUsuario(re);	
				
				r.add(vo);				
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return r;
	}
	public int buscarReserva(String nombreUsuario) throws DAOException{
		SalaDAO saladao = new SalaDAO();
		UsuarioDAO usuariodao = new UsuarioDAO();
		
		int idUsuario = usuariodao.BuscarUsuario(nombreUsuario);
		
		// En la conexion a la Base de Datos
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int idReserva=0;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idReserva from reserva where Usuario_idUsuario= ?";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				idReserva=rs.getInt(1);		
				System.out.print("Imprimio el metodo Eliminar reserva"+idReserva);
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOException(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		
		return idReserva;
	}

}